
#include "patient.h"
#include "debug.h"
#include "gestion_patients.h"
#include "configuration.h"
#include "dessiner.h"



void modifier_patient_gtk(patient_db patient[],patient_db m, int id, int n, char msg[])
{
	int choix;
	
	int i = -1;
	
	i = recherche_patient(patient,id,n);
	if ( i != -1 )
	{    
		patient[i] = m;
		strcpy(msg,"le patient est modifié");
		exporter_patients(patient,n);
	}
	else
	{
		strcpy(msg,"le patient n'existe pas");
	}
    
}

void supprimer_patient_gtk (patient_db patient[],int id,int  *n, char msg[])
{
	int pos = -1;
	int k = 0;
	while (( pos == -1) && ( k < *n ))
	{
		if (patient[k].id == id)
			pos = k;
		else
			k++;
	}
	if ( pos == -1 )
		strcpy(msg,"Le patient n'existe pas");
	else
	{
		for ( k = pos;k<=*n;k++)
		{
			patient[k] = patient[k+1];
		}
		*n = *n-1;
		strcpy(msg,"Le patient est supprime");
	}
}


void init_patient_db_gtk(patient_db patient[], int *n, char msg[])
{
        int k;
		k = *n-1;
		char smsg[50];

        while ( k > -1)
        {
			sprintf(smsg,"[!] Suppression du patient '%s %s'\n",patient[k].nom,patient[k].prenom);
			supprimer_patient(patient,patient[k].id,n);
			k = *n - 1;
			strcpy(msg,smsg);
		}
		strcpy(msg,"Le liste est vide\n");
		remove(FICHIER_PATIENTS);
}


// Extraire les patients de FICHIER_PATIENTS et mettre les donnees dans un tableau de structure patients_db
void extraire_patients(patient_db p[], int *n)
{
        FILE *f;
	f = fopen(FICHIER_PATIENTS,"r");
        if ( f != NULL)
        {
                debug("Chargement des donnees des patients");
                while ( fscanf(f,"%d %s %s %d %s",&p[*n].id,p[*n].nom,p[*n].prenom,&p[*n].age,p[*n].passeport) != EOF) // tant que nous ne sommes pas arrivés à la fin du fichier , on lit les données et on les met dans un tableau

                {
                        debug("les donnees du '%s %s' sont chargees",p[*n].nom,p[*n].prenom);
                        *n = *n + 1;
                }
                fclose(f);
        }
	else
		debug("Impossible de charger les donnees des patients");

}


// Enregistrer les donnees du tableau de strucutre patients_db dans le fichier FICHIER_PATIENTS
void exporter_patients(patient_db p[], int n)
{
 	int i = 0;
	FILE *f;

	debug("Exportation des patients");
	debug("le nombre des patients a exporter : %d",n);
	remove(FICHIER_PATIENTS); // permet de supprimer le contenu initial du fichier
    f = fopen(FICHIER_PATIENTS,"w");

    if ( f != NULL)
		{
			for ( i = 0; i < n ; i++)
			{
				debug("Exportation du patient '%s %s'",p[i].nom,p[i].prenom);
				fprintf(f,"%d %s %s %d %s\n",p[i].id,p[i].nom,p[i].prenom,p[i].age,p[i].passeport);
			}
        fclose(f);
		}
		else
			debug("Impossible d'ajouter '%s %s'",p[i].nom,p[i].prenom);

	debug("Exportation fini");
}

int recherche_patient(patient_db patient[], int aid, int n)
{
        int pos,k;
        pos = -1;
        k = 0;
	while (( pos == -1) && ( k < n ))
        {
                if (patient[k].id == aid)
                        pos = k;
                else
			k++;
        }
	if ( pos == -1 )
                printf("[!] Le personnel n'existe pas\n");
        return pos;
}


void ajouter_patient_gtk(patient_db patient[],patient_db p, int *n)
{
        printf("[!] Ajout d'un patient\n");
        patient[*n] = p;
        printf("[!] patient ajouté\n");
        *n = *n + 1;
}

void affiche_choix__(char variable[])
{
	dessiner_ligne(46);
        dessiner_milieu(46,"1/ Modifier le nom du %s",variable);
	printf("\n");
        dessiner_milieu(46,"2/ Modifier le prenom du %s",variable);
        printf("\n");
	dessiner_milieu(46,"3/ Modifier l'age du %s",variable);
        printf("\n");
        dessiner_milieu(46,"4/ Modifier le numero passeport du %s",variable);
        printf("\n");
	dessiner_milieu(46,"0/ Retour");
	printf("\n");
	dessiner_ligne(46);
}


void modifier_patient( patient_db patient[], int n) // permet de modifier un patient de id donné
{
	int id, choix;
	affiche_choix__("patient");
        printf("> ");
        scanf("%d",&choix);
       	int i = -1;
        afficher_patient_db(patient,n);
        printf("[!] Entrez l'ID: ");
        scanf("%d",&id);

       	i = recherche_patient(patient,id,n);
        if (i != -1)
        {

		switch (choix) {
			case 1: {printf("		[+] Vous avez choisi de modifier le nom du patient: ");
				fflush(stdin);
				scanf("%s",patient[i].nom);}
				break;		

			case 2: {printf("		[+] Vous avez choisi de modifier le prenom du patient: ");
				fflush(stdin);
				scanf("%s",patient[i].prenom);}
				break;		
		

			case 3: {printf("		[+] Vous avez choisi de modifier l'age du patient: ");
		
				scanf("%d",&patient[i].age);}
				break;		

        		
			case 4: {printf("               [+] Vous avez choisi de modifier le numero passeport du patient: ");

               			
				scanf("%s",patient[i].passeport);}
        			
				break;

			case 0: {}
				break;


			default: {printf("\nmauvais choix");}
		}
	}
}

void saisir_patient(patient_db *p) // patient_db : structure qui contient les variables des patients
{
	printf("		[+] Entrer l'id: ");

	scanf("%d",&p->id);

	printf("		[+] Entrer le nom: ");
	fflush(stdin);
	scanf("%s",p->nom);

	printf("		[+] Entrer le prenom: ");
	fflush(stdin);
	scanf("%s",p->prenom);


	do
	{
		printf("		[+] Entrer l'age: ");
		scanf("%d",&p->age);
	}
	while((p->age > 100) || (p->age < 0));

	do
	{
	printf("                [+] Entrer le numero de passeport du patient (9 caractere): ");
        fflush(stdin);
        scanf("%s",p->passeport); 
        }
	while (strlen (p->passeport) != 9);

}

void afficher_en_tete_patient()
{
        printf("|");
        dessiner_colonne_d(5,"ID");
        dessiner_colonne_d(20,"Nom");
        dessiner_colonne_d(20,"Prenom");
        dessiner_colonne_d(5,"Age");
        dessiner_colonne_d(20,"Passeport");
        printf("\n");
}

void afficher_patient(patient_db p)
{
	printf("|");
        dessiner_colonne_d(5,"%d",p.id);
        dessiner_colonne_d(20,"%s",p.nom);
	dessiner_colonne_d(20,"%s",p.prenom);
       	dessiner_colonne_d(5,"%d",p.age);
  	dessiner_colonne_d(20,"%s",p.passeport);
        printf("\n");
}

void ajouter_patient(patient_db patient[], int *n)
{
	patient_db p;
	printf("[!] Ajout d'un patient\n");
	saisir_patient(&p);
	patient[*n] = p;
	printf("[!] Patient ajoute\n");
	*n = *n + 1;
	exporter_patients(patient ,*n);
}

void afficher_patient_db(patient_db patient[], int n)
{
   int i = 0;
	printf("[!] le nombre des patients: %d\n",n);
	if ( n <= 0)
		printf("[!] La liste est vide\n");
	else
    {
        dessiner_ligne(75);
        afficher_en_tete_patient();
        for (i=0;i<n;i++)
        {
            afficher_patient (patient[i]);
        }
        dessiner_ligne(75);
    }
}

void init_patient_db(patient_db patient[], int *n)
{
        int k;
	k = *n-1;
        while ( k > -1)
        {
		
		printf("[!] Suppression du patient '%s %s'\n",patient[k].nom,patient[k].prenom);
    		supprimer_patient(patient,patient[k].id,n);
		k = *n - 1;
	}
	printf("[!] La liste des patients est initialisee\n");
	remove(FICHIER_PATIENTS);
}

void supprimer_patient(patient_db patient[], int id, int *n)
{
	int pos = -1;
	int k = 0;

	while (( pos == -1) && ( k < *n ))
	{
		if (patient[k].id == id )
			pos = k;
		else
			k++;
	}
	if ( pos == -1 )
		printf("[!] Le patient n'existe pas\n");
	else
	{
		for ( k = pos;k<=*n;k++)
		{
			patient[k] = patient[k+1];
		}
		*n = *n-1;
		printf("[!] Le patient est supprime\n");
		exporter_patients(patient ,*n);
	}
}

